package models;

import java.sql.SQLException;
import java.util.GregorianCalendar;
import java.util.List;

import models.dados.ChaveRepetidaException;
import models.dados.DadoNaoEncontradoException;

public class ServicosCliente implements InterfaceServicosCliente {

	private static ServicosCliente unicaInstancia;
	private LoginCliente loginCliente;
	private CadastroCliente cadastroCliente;
	static private Pedido pedidos;
	private PedidosCliente pedidosCliente;
	private ListaDonuts listaDonuts;
	private PesquisaUsuario pesquisaUsuario;
	private PesquisaProduto pesquisaProduto;

	private ServicosCliente() {
		loginCliente = new LoginCliente();
		pedidos = new Pedido();
		pedidosCliente = new PedidosCliente();
		listaDonuts = new ListaDonuts();
		pesquisaUsuario = new PesquisaUsuario();
		pesquisaProduto = new PesquisaProduto();
		cadastroCliente = new CadastroCliente();
		pedidosCliente = new PedidosCliente();
		
		
	}

	public static ServicosCliente getInstancia() {
		if (unicaInstancia == null) {
			unicaInstancia = new ServicosCliente();
			return unicaInstancia;
		}
		return unicaInstancia;
	}
	
	
	

	@Override
	public boolean login(String usuario, String senha)throws DadoNaoEncontradoException, 
	                                          UsuarioBloqueadoException {
		
		
		return loginCliente.login(usuario, senha);

	}

	@Override
	public void cadastrarCliente(String nome,String rua, int numero, String bairro,
			String complemento,String cep, String telefone, String email,
			String nomeUsuario, String senha) throws ChaveRepetidaException {
		
		this.cadastroCliente.cadastrar(nome, rua, numero, bairro, complemento, cep,telefone, email, nomeUsuario, senha);
		
		

	}
	
	@Override
	public void alterarDadosCadastrais(String usuario,String nome,String rua, int numero,String bairro,String complemento,String cep,String telefone,String email) throws DadoNaoEncontradoException{
		this.cadastroCliente.alterarDados(usuario, nome, rua, numero, bairro, complemento, cep, telefone, email);
	}

	@Override
	public void adicionarProduto(Produto produto,int quantidade) {
		this.pedidos.adicionarProduto(produto, quantidade);

	}
	
	@Override //falta incluir no diagrama de classes
	public Pedido getPedidoAtual(){
		return this.pedidos;
	}
	
	@Override
	public Pedido getPedido(long numero) throws DadoNaoEncontradoException{
		return this.pedidosCliente.getPedido(numero);
	}

	@Override
	public void finalizarPedido(String nome, String rua,int numero,String bairro,String complemento,String cep,String email,String telefone) throws ChaveRepetidaException, DadoNaoEncontradoException {
		this.pedidosCliente.finalizarPedido(this.pedidos, nome, rua, numero, bairro, complemento, cep, email,telefone);
	}
	
	@Override
	public void finalizarPedido(String usuario) throws DadoNaoEncontradoException{
		this.pedidosCliente.finalizarPedido(pedidos, usuario);
		
		
	}
	
	@Override
	public void cancelarPedido(long numero,String usuario) throws DadoNaoEncontradoException, AcessoNegadoException, UsuarioBloqueadoException{
		this.pedidosCliente.cancelarPedido(numero, usuario);
	}

	@Override
	public void alterarSenha(String senhaAtual, String novaSenha,String usuario) throws DadoNaoEncontradoException, SenhaIncorretaException, UsuarioBloqueadoException {
		loginCliente.alterarSenha(senhaAtual, novaSenha, usuario);

	}

	@Override
	public List<Produto> listarDonuts() throws SQLException {
		return this.listaDonuts.listar();
	}

	@Override
	public List<Pedido> listarPedidos(long numero,String status,String usuario,GregorianCalendar dataExata,GregorianCalendar dataInicial,
			GregorianCalendar dataFinal) throws DadoNaoEncontradoException {
		return this.pedidosCliente.listarPedidos(numero,status, usuario,dataExata,dataInicial,dataFinal);
		
	}


	@Override
	public Cliente getCliente(String usuario) throws DadoNaoEncontradoException {
		return pesquisaUsuario.getCliente(usuario);
	}

	@Override
	public Produto pesquisarProduto(String nome)
			throws DadoNaoEncontradoException {
		
		return this.pesquisaProduto.pequisaProduto(nome);
	}
	


}
